package sort;

import java.util.HashSet;
import java.util.Set;

import sort.record.Record;
import sort.record.Records;

/**
 * @author masaru-gotou
 *
 */
public class CheckUtil {
	/**
	 * 同一性チェック（データの中味が同じか）
	 * @param before
	 * @param after
	 * @return 同一であればtrue,同一でなければfalse
	 */
	public static boolean isSame(Records before, Records after) {
		if ( !before.containsAll(after) ) return false;
		
		return after.containsAll(before);
	}
	/**
	 * 
	 * @param recs
	 * @return
	 */
	public static boolean isSorted(Records recs) {
		for(int i=1; i<recs.size(); i++ ) {
			if (recs.get(i).getKey() < recs.get(i-1).getKey() )
				return false;
		}
		return true;
	}
	/**
	 * 安定性チェック（同等なデータのソート前の順序が、ソート後も保存されているか）<b>
	 * ソート前とソート結果のデータ内容が同じ(isSame(unsorted,sorted)==true)でないと、結果は保証されません。
	 * @param unsorted ソート前
	 * @param sotred ソート後
	 * @return 安定であればtrue,安定でなければfalse
	 */
	public static boolean isStabled(Records unsorted, Records sorted) {
		// キー値のSetを作る
		Set<Integer> keys = new HashSet<Integer>();
		for (Record rec : sorted ) {
			keys.add(rec.getKey());
		}
		// キー値ごとに値を双方から取り出し、順に付き合わせる
		for (Integer key : keys) {
			Records unsorted_subset = unsorted.getRecordsByKey(key.intValue());
			Records sorted_subset = sorted.getRecordsByKey(key.intValue());
			if ( !isStabledRecords(unsorted_subset, sorted_subset) ) return false;
		}
		return true;
	}
	private static boolean isStabledRecords(Records unsorted_subset, Records sorted_subset) {
		for ( int i=0; i<unsorted_subset.size(); i++ ) {
			if ( !unsorted_subset.get(i).equals(sorted_subset.get(i)) ) return false;
		}
		return true;
	}
}
